/*
 * Summary: the XMLReader implementation
 * Description: API of the XML streaming API based on C# interfaces.
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */

#ifndef __XML_XMLREADER_H__
#define __XML_XMLREADER_H__

#include <libxml/xmlversion.h>
#include <libxml/tree.h>
#include <libxml/xmlIO.h>
#ifdef LIBXML_SCHEMAS_ENABLED
#include <libxml/relaxng.h>
#include <libxml/xmlschemas.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

/**
 * xmlParserSeverities:
 *
 * How severe an error callback is when the per-reader error callback API
 * is used.
 */
typedef enum {
    XML_PARSER_SEVERITY_VALIDITY_WARNING = 1,
    XML_PARSER_SEVERITY_VALIDITY_ERROR = 2,
    XML_PARSER_SEVERITY_WARNING = 3,
    XML_PARSER_SEVERITY_ERROR = 4
} xmlParserSeverities;

#ifdef LIBXML_READER_ENABLED

/**
 * xmlTextReaderMode:
 *
 * Internal state values for the reader.
 */
typedef enum {
    XML_TEXTREADER_MODE_INITIAL = 0,
    XML_TEXTREADER_MODE_INTERACTIVE = 1,
    XML_TEXTREADER_MODE_ERROR = 2,
    XML_TEXTREADER_MODE_EOF =3,
    XML_TEXTREADER_MODE_CLOSED = 4,
    XML_TEXTREADER_MODE_READING = 5
} xmlTextReaderMode;

/**
 * xmlParserProperties:
 *
 * Some common options to use with xmlTextReaderSetParserProp, but it
 * is better to use xmlParserOption and the xmlReaderNewxxx and
 * xmlReaderForxxx APIs now.
 */
typedef enum {
    XML_PARSER_LOADDTD = 1,
    XML_PARSER_DEFAULTATTRS = 2,
    XML_PARSER_VALIDATE = 3,
    XML_PARSER_SUBST_ENTITIES = 4
} xmlParserProperties;

/**
 * xmlReaderTypes:
 *
 * Predefined constants for the different types of nodes.
 */
typedef enum {
    XML_READER_TYPE_NONE = 0,
    XML_READER_TYPE_ELEMENT = 1,
    XML_READER_TYPE_ATTRIBUTE = 2,
    XML_READER_TYPE_TEXT = 3,
    XML_READER_TYPE_CDATA = 4,
    XML_READER_TYPE_ENTITY_REFERENCE = 5,
    XML_READER_TYPE_ENTITY = 6,
    XML_READER_TYPE_PROCESSING_INSTRUCTION = 7,
    XML_READER_TYPE_COMMENT = 8,
    XML_READER_TYPE_DOCUMENT = 9,
    XML_READER_TYPE_DOCUMENT_TYPE = 10,
    XML_READER_TYPE_DOCUMENT_FRAGMENT = 11,
    XML_READER_TYPE_NOTATION = 12,
    XML_READER_TYPE_WHITESPACE = 13,
    XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14,
    XML_READER_TYPE_END_ELEMENT = 15,
    XML_READER_TYPE_END_ENTITY = 16,
    XML_READER_TYPE_XML_DECLARATION = 17
} xmlReaderTypes;

/**
 * xmlTextReader:
 *
 * Structure for an xmlReader context.
 */
typedef struct _xmlTextReader xmlTextReader;

/**
 * xmlTextReaderPtr:
 *
 * Pointer to an xmlReader context.
 */
typedef xmlTextReader *xmlTextReaderPtr;

/*
 * Constructors & Destructor
 */
XMLPUBFUN xmlTextReaderPtr XMLCALL
            xmlNewTextReader    (xmlParserInputBufferPtr input,
                                             const char *URI);
XMLPUBFUN xmlTextReaderPtr XMLCALL
            xmlNewTextReaderFilename(const char *URI);

XMLPUBFUN void XMLCALL
            xmlFreeTextReader    (xmlTextReaderPtr reader);

XMLPUBFUN int XMLCALL
            xmlTextReaderSetup(xmlTextReaderPtr reader,
                   xmlParserInputBufferPtr input, const char *URL,
                   const char *encoding, int options);

/*
 * Iterators
 */
XMLPUBFUN int XMLCALL
            xmlTextReaderRead    (xmlTextReaderPtr reader);

#ifdef LIBXML_WRITER_ENABLED
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderReadInnerXml    (xmlTextReaderPtr reader);

XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderReadOuterXml    (xmlTextReaderPtr reader);
#endif

XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderReadString        (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderReadAttributeValue    (xmlTextReaderPtr reader);

/*
 * Attributes of the node
 */
XMLPUBFUN int XMLCALL
            xmlTextReaderAttributeCount(xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderDepth    (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderHasAttributes(xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderHasValue(xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderIsDefault    (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderNodeType    (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderQuoteChar    (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderReadState    (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
                        xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader);

XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstBaseUri    (xmlTextReaderPtr reader);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstLocalName    (xmlTextReaderPtr reader);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstName    (xmlTextReaderPtr reader);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstPrefix    (xmlTextReaderPtr reader);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstXmlLang    (xmlTextReaderPtr reader);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstString    (xmlTextReaderPtr reader,
                         const xmlChar *str);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstValue    (xmlTextReaderPtr reader);

/*
 * use the Const version of the routine for
 * better performance and simpler code
 */
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderBaseUri    (xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderLocalName    (xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderName    (xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderNamespaceUri(xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderPrefix    (xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderXmlLang    (xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderValue    (xmlTextReaderPtr reader);

/*
 * Methods of the XmlTextReader
 */
XMLPUBFUN int XMLCALL
            xmlTextReaderClose        (xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderGetAttributeNo    (xmlTextReaderPtr reader,
                         int no);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderGetAttribute    (xmlTextReaderPtr reader,
                         const xmlChar *name);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderGetAttributeNs    (xmlTextReaderPtr reader,
                         const xmlChar *localName,
                         const xmlChar *namespaceURI);
XMLPUBFUN xmlParserInputBufferPtr XMLCALL
            xmlTextReaderGetRemainder    (xmlTextReaderPtr reader);
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderLookupNamespace(xmlTextReaderPtr reader,
                         const xmlChar *prefix);
XMLPUBFUN int XMLCALL
            xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader,
                         int no);
XMLPUBFUN int XMLCALL
            xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader,
                         const xmlChar *name);
XMLPUBFUN int XMLCALL
            xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader,
                         const xmlChar *localName,
                         const xmlChar *namespaceURI);
XMLPUBFUN int XMLCALL
            xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderMoveToElement    (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderNormalization    (xmlTextReaderPtr reader);
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstEncoding  (xmlTextReaderPtr reader);

/*
 * Extensions
 */
XMLPUBFUN int XMLCALL
            xmlTextReaderSetParserProp    (xmlTextReaderPtr reader,
                         int prop,
                         int value);
XMLPUBFUN int XMLCALL
            xmlTextReaderGetParserProp    (xmlTextReaderPtr reader,
                         int prop);
XMLPUBFUN xmlNodePtr XMLCALL
            xmlTextReaderCurrentNode    (xmlTextReaderPtr reader);

XMLPUBFUN int XMLCALL
            xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader);

XMLPUBFUN int XMLCALL
            xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader);

XMLPUBFUN xmlNodePtr XMLCALL
            xmlTextReaderPreserve    (xmlTextReaderPtr reader);
#ifdef LIBXML_PATTERN_ENABLED
XMLPUBFUN int XMLCALL
            xmlTextReaderPreservePattern(xmlTextReaderPtr reader,
                         const xmlChar *pattern,
                         const xmlChar **namespaces);
#endif /* LIBXML_PATTERN_ENABLED */
XMLPUBFUN xmlDocPtr XMLCALL
            xmlTextReaderCurrentDoc    (xmlTextReaderPtr reader);
XMLPUBFUN xmlNodePtr XMLCALL
            xmlTextReaderExpand        (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderNext        (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderNextSibling    (xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderIsValid    (xmlTextReaderPtr reader);
#ifdef LIBXML_SCHEMAS_ENABLED
XMLPUBFUN int XMLCALL
            xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader,
                         const char *rng);
XMLPUBFUN int XMLCALL
            xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader,
                         xmlRelaxNGPtr schema);
XMLPUBFUN int XMLCALL
            xmlTextReaderSchemaValidate    (xmlTextReaderPtr reader,
                         const char *xsd);
XMLPUBFUN int XMLCALL
            xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader,
                         xmlSchemaValidCtxtPtr ctxt,
                         int options);
XMLPUBFUN int XMLCALL
            xmlTextReaderSetSchema    (xmlTextReaderPtr reader,
                         xmlSchemaPtr schema);
#endif
XMLPUBFUN const xmlChar * XMLCALL
            xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader);
XMLPUBFUN int XMLCALL
            xmlTextReaderStandalone     (xmlTextReaderPtr reader);


/*
 * Index lookup
 */
XMLPUBFUN long XMLCALL
        xmlTextReaderByteConsumed    (xmlTextReaderPtr reader);

/*
 * New more complete APIs for simpler creation and reuse of readers
 */
XMLPUBFUN xmlTextReaderPtr XMLCALL
        xmlReaderWalker        (xmlDocPtr doc);
XMLPUBFUN xmlTextReaderPtr XMLCALL
        xmlReaderForDoc        (const xmlChar * cur,
                     const char *URL,
                     const char *encoding,
                     int options);
XMLPUBFUN xmlTextReaderPtr XMLCALL
        xmlReaderForFile    (const char *filename,
                     const char *encoding,
                     int options);
XMLPUBFUN xmlTextReaderPtr XMLCALL
        xmlReaderForMemory    (const char *buffer,
                     int size,
                     const char *URL,
                     const char *encoding,
                     int options);
XMLPUBFUN xmlTextReaderPtr XMLCALL
        xmlReaderForFd        (int fd,
                     const char *URL,
                     const char *encoding,
                     int options);
XMLPUBFUN xmlTextReaderPtr XMLCALL
        xmlReaderForIO        (xmlInputReadCallback ioread,
                     xmlInputCloseCallback ioclose,
                     void *ioctx,
                     const char *URL,
                     const char *encoding,
                     int options);

XMLPUBFUN int XMLCALL
        xmlReaderNewWalker    (xmlTextReaderPtr reader,
                     xmlDocPtr doc);
XMLPUBFUN int XMLCALL
        xmlReaderNewDoc        (xmlTextReaderPtr reader,
                     const xmlChar * cur,
                     const char *URL,
                     const char *encoding,
                     int options);
XMLPUBFUN int XMLCALL
        xmlReaderNewFile    (xmlTextReaderPtr reader,
                     const char *filename,
                     const char *encoding,
                     int options);
XMLPUBFUN int XMLCALL
        xmlReaderNewMemory    (xmlTextReaderPtr reader,
                     const char *buffer,
                     int size,
                     const char *URL,
                     const char *encoding,
                     int options);
XMLPUBFUN int XMLCALL
        xmlReaderNewFd        (xmlTextReaderPtr reader,
                     int fd,
                     const char *URL,
                     const char *encoding,
                     int options);
XMLPUBFUN int XMLCALL
        xmlReaderNewIO        (xmlTextReaderPtr reader,
                     xmlInputReadCallback ioread,
                     xmlInputCloseCallback ioclose,
                     void *ioctx,
                     const char *URL,
                     const char *encoding,
                     int options);
/*
 * Error handling extensions
 */
typedef void *  xmlTextReaderLocatorPtr;

/**
 * xmlTextReaderErrorFunc:
 * @arg: the user argument
 * @msg: the message
 * @severity: the severity of the error
 * @locator: a locator indicating where the error occured
 *
 * Signature of an error callback from a reader parser
 */
typedef void   (XMLCALL *xmlTextReaderErrorFunc)(void *arg,
                         const char *msg,
                         xmlParserSeverities severity,
                         xmlTextReaderLocatorPtr locator);
XMLPUBFUN int XMLCALL
            xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator);
/*int             xmlTextReaderLocatorLinePosition(xmlTextReaderLocatorPtr locator);*/
XMLPUBFUN xmlChar * XMLCALL
            xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator);
XMLPUBFUN void XMLCALL
            xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader,
                         xmlTextReaderErrorFunc f,
                         void *arg);
XMLPUBFUN void XMLCALL
            xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader,
                               xmlStructuredErrorFunc f,
                               void *arg);
XMLPUBFUN void XMLCALL
            xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader,
                         xmlTextReaderErrorFunc *f,
                         void **arg);

#endif /* LIBXML_READER_ENABLED */

#ifdef __cplusplus
}
#endif

#endif /* __XML_XMLREADER_H__ */

